/**
 * 观察者
 */
class Wather {
    /**
     * @param vm  实例
     * @param expr 值
     * @param cb 回调
     */
    constructor(vm, expr, cb) {
        this.vm = vm;
        this.expr = expr;
        this.cb = cb;
        //先获取下旧的
        this.value = this.get(vm, expr);
    }

    getVal(vm, expr) { // 获取实例上对应的数据 针对深层嵌套
        expr = expr.split('.'); // message.a => [message,a]
        return expr.reduce((prev, next) => { // vm.$data.a
            return prev[next];
        }, vm.$data);
    }

    get() {
        // 将当前的 watcher 添加到 Dep 类的静态属性上
        Dep.target = this;
        let value = this.getVal(this.vm, this.expr);
        // 清空 Dep 上的 Watcher，防止重复添加
        Dep.target = null;
        return value;
    }

    //对外的更新方法
    update() {
        let newVal = this.getVal(this.vm, this.expr);
        let oldVal = this.value;
        if (newVal !== oldVal) {
            this.cb(newVal); //调用回调
        }
    }
}